package chapter05

/**
  * 闭包: 如果一个函数访问到了它的外部(局部)变量的值,那么这个函数和他所处的环境,称为闭包
  * 函数柯里化: 把一个参数列表的多个参数,变成多个参数列表
  */
object Test09_ClosureAndCurrying {

  def main(args: Array[String]): Unit = {
    // 1.方式1，将固定加数作为另一个参数传入,但是是作为“第一层参数”传入
    def addByFour1(): Int => Int = {
      val a = 4

      def addB(b: Int): Int = {
        a + b
      }

      addB
    }

    // 方式2.1
    def addByA(a: Int): Int => Int = {
      def addB(b: Int): Int = {
        a + b
      }

      addB
    }

    println("----------------")
    println(addByA(35)(24))
    println(addByA(33)(24))
    println(addByA(222)(24))
    println("----------------")

    // 方式2.2 lambda表达式简写
    def addByA1(a: Int): Int => Int = {

      b => a + b

    }

    println("----------------")

    // 方式2.3 lambda表达式简写
    def addByA2(a: Int): Int => Int = a + _

    println("----------------")

    // 方式2.4柯里化简写 ==依赖闭包
    def addCurring(a: Int)(b: Int): Int = {
      a + b
    }

    println(addCurring(35)(24))
    println(addCurring(33)(24))
    println(addCurring(222)(24))
  }
}
